from django.shortcuts import render
from django.views import View

from apps.users.models import User
from django.http import JsonResponse

# Create your views here.
from meiduo_mall.settings.dev import logger


class UsernameCountView(View):
    def get(self, request, username):

        # 提取参数
        # 校验参数  正则提供了

        # 数据处理
        try:
            count = User.objects.filter(
                username=username
            ).count()
        except Exception as e:
            logger.error('数据库错误')
            return JsonResponse({
                'code': 400,
                'errmsg': '数据库错误',
            }, status=500)

        # 构建响应
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'count': count

        })


class MobileCountView(View):
    def get(self, request, mobile):
        # 1.提取参数
        # 2.校验参数
        # 3.数据处理
        try:
            count = User.objects.filter(
                mobile=mobile
            ).count()
        except Exception as e:
            logger.error('查询手机号重复，错误')
            return JsonResponse({
                'code': 0,
                'errmsg': '查询手机号重复，错误',
            }, status=500)
        # 4.构建响应
        return JsonResponse({
            'code': 0,
            'errmsg': 'OK',
            'count': count
        })


import json
import re
from django.contrib.auth import login


class RegisterView(View):
    def post(self, request):
        # 1.提取参数
        data = request.body.decode()
        data = json.loads(data)

        username = data.get('username')
        password = data.get('password')
        password2 = data.get('password2')
        mobile = data.get('mobile')
        sms_code = data.get('sms_code')

        allow = data.get('allow', False)

        # 2.校验参数
        if not all([username, password, password2, mobile, sms_code]):
            return JsonResponse({
                'code': 400,
                'errmsg': '参数缺失，缺少必要参数'
            }, status=400)

        # if allow != True:
        #     return JsonResponse({
        #         'code': 400,
        #         'errmsg': 'allow格式有误!请勾选同意'
        #     })   下面的好

        if not allow:
            return JsonResponse({
                'code': 400,
                'errmsg': '请勾选同意'
            })

        if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username):
            return JsonResponse({
                'code': 400,
                'errmsg': '用户名格式错误'
            })

        if not re.match(r'^[a-zA-z0-9]{8,20}$', password):
            return JsonResponse({
                'code': 400,
                'errmsg': 'password格式输入有误'
            })

        if password != password2:
            return JsonResponse({
                'code': 400,
                'errmsg': '两次密码输入不对，请重新输入'
            })

        if not re.match(r'^1[3-9]\d{9}$', mobile):
            return JsonResponse({
                'code': 400,
                'errmsg': 'mobile格式有误，请输入正确的手机号'
            })

        # TODO ： 将来实现短信验证码接口之后，此处填充短信验证码业务

        from  django_redis import get_redis_connection

        conn = get_redis_connection('verify_code')
        # sms_code_from_redis = conn.get('sms_%s' % mobile)
        sms_code_from_redis = conn.get('sms_%s' % mobile)

        if not sms_code_from_redis:
            return JsonResponse({'code': 400,
                                 'errmsg': '短信验证码失效'
                                 }, status=403)
        # 对比用户输入的和服务端存储的短信验证码是否一致
        if sms_code != sms_code_from_redis.decode():
            return JsonResponse({'code': 400,
                                 'errmsg': '短信验证码有误'
                                 }, status=400)

        # 3.数据处理  ---上传数据库的要try一下 ，检查错误
        try:
            user = User.objects.create_user(
                username=username,
                password=password,
                mobile=mobile
            )
        except Exception as e:
            logger.error('用户新建失败')
            return JsonResponse({
                'code': 400,
                'errmsg': '新建用户失败'
            }, status=500)

        login(request, user)

        # 4.构建响应
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok，注册成功'
        })


import json
from django.contrib.auth import login, authenticate


class LoginView(View):
    def post(self, request):
        data = json.loads(request.body.decode())
        username = data.get('username')
        password = data.get('password')
        remembered = data.get('remembered', False)
        # 2.校验(整体 + 单个)
        if not all([username, password]):
            return JsonResponse({'code': 400, 'errmsg': '缺少必传参数'},status=400)
        if not re.match(r'^[a-zA-Z0-9_@.-]{5,20}$', username):
            return JsonResponse({'code': 400, 'errmsg': '用户名格式有误'}, status=400)
        if not re.match(r'^\w{8,20}$', password):
            return JsonResponse({'code': 400, 'errmsg': '密码格式有误'}, status=400)




        # 3.验证是否能够登录
        user = authenticate(request, username=username, password=password)

        # 判断是否为空,如果为空,返回
        if user is None:
            return JsonResponse({'code': 400, 'errmsg': '用户名或者密码错误'})

        # 4.状态保持
        login(request, user)

        # 5.判断是否记住用户
        # if remembered != True:
        if not remembered:

            # 7.如果没有记住: session立刻失效
            request.session.set_expiry(0)
        else:
            # 6.如果记住:  session设置为两周有效
            request.session.set_expiry(None)

        # 8.返回json
        # return JsonResponse({'code': 0, 'errmsg': 'ok'})
        response = JsonResponse({'code': 0, 'errmsg': "ok"})

        # 5、再cookie中设置用户名，用作前端页面展示
        response.set_cookie(
            key='username',
            value=user.username,  # 固定页面展示用户名
            max_age=3600 * 24 * 14
        )
        return response


from django.contrib.auth import logout
# 用户退出登陆
class LogoutView(View):

    def delete(self, request):
        # 1、提取参数
        # 2、校验参数
        # 3、数据/业务处理
        # 通过request--->获取cookie中的sessionid--->根据sessionid删除redis中的用户数据
        logout(request)
        # 4、构建响应
        response = JsonResponse({'code': 0, 'errmsg': 'ok'})
        response.delete_cookie('username')
        return response


from meiduo_mall.utils.views import LoginRequiredJSONMixin
# 获取用户中心页数据
# LoginRequiredMixin：如果一个类视图继承自LoginRequiredMixin，那么这个类视图中所有的接口必须登陆才能访问
class UserInfoView(LoginRequiredJSONMixin, View):

    def get(self, request):
        # 1、验证用户是否登陆
        # request.user:
        # 1、如果用户已经登陆(cookie中有sessionid)，
        # 在请求的时候后端会根据sessionid查找用户数据，并且把request.user设置为查找到的用户模型类对象
        # 一句话：request.user就是当前已经登陆的用户对象
        # 2、如果用户未登陆，则request.user是一个AnonymousUser对象——匿名用户对象

        # 如果已经登陆：request.user.is_authenticated == True
        # 如果未登陆： request.user.is_authenticated == False
        # if not request.user.is_authenticated:
            # 未登陆
            # return JsonResponse({'code': 0, 'errmsg': '未登陆！'}, status=401)


        # 2、获取用户对象，构造响应参数
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'info_data': {
                'username': request.user.username,
                'mobile': request.user.mobile,
                'email': request.user.email,
                'email_active': request.user.email_active
            }
        })

# class EmailView(View):
#
#     def put(self, request):
#         json_dict = json.loads(request.body.decode())
#         email = json_dict.get('email')
